﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection.Emit;
using System.Diagnostics;
using System.Security.Cryptography.X509Certificates;
using static System.Windows.Forms.AxHost;

struct gameInfoStruct
{
    // 定义游戏信息结构体
    public string game;
    public string file;
    public string files;
    // 判断是否是双行file
    public int fileType;
    public string box;
    // 判断媒体文件是按game还是按file记录。
    public int mediaType;
    // 记录封面路径
    public string mediaDir;
    
}

namespace GIMG
{
    public partial class Form1 : Form
    {
        // 定义公共变量
        // 游戏目录gameDirPath
        public static string gameDirPath;
        //txt文件名
        public static string gameTextName = "metadata.pegasus.txt";
        //txt文件名
        public static string imgDirName = "images";
        // 记录成功拷贝的文件数量
        public static int nc;

        // 定义一个存放每一个游戏gameInfoStruct数据体的list
        List<gameInfoStruct> gameList;
        //定义存放每条游戏信息的结构体gameInfoStruct
        gameInfoStruct gameInfoStruct;
        // 定义一个新的目录选择对话框，在这里定义可以实现记录上次选择目录的效果
        FolderBrowserDialog folderDlg = new FolderBrowserDialog();



        public Form1()
        {
            InitializeComponent();
        }
        #region  预载函数
        public int CopyFile(string dir1, string name)
        {
            //复制文件
            //dir1，要复制的文件的路径已经全名(包括后缀)
            //dir2，目标位置,并指定新的文件名
            //把“/”替换成“\\”
            dir1 = dir1.Replace("/", "\\");
            FileInfo fi1 = new FileInfo(dir1);
            string dir2 = gameDirPath + "\\" + imgDirName + "\\" + name;
            FileInfo fi2 = new FileInfo(dir2);

            if (fi1.Exists) 
            {
                if (File.Exists(dir2))
                {
                    fi2.Delete();
                }
                fi1.CopyTo(dir2);
            }

            if (File.Exists(dir2))
            {
                return 1;
            }
            else return 0;
        }
        #endregion

        private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            // 加载目录按钮

            // 打开选择目录对话框
            folderDlg.ShowDialog();
            string gamePath = folderDlg.SelectedPath;

            // 读取文本，不存在则报错
            StreamReader readerText = null;
            if (File.Exists(gamePath + "\\" + gameTextName))
            {
                //readerText.Close();
                readerText = new StreamReader(gamePath + "\\" + gameTextName);

            }
            else
            {
                MessageBox.Show("打开失败！", "咳咳！");
                return;
            }

            // 初始化
            gameList = new List<gameInfoStruct>();
            gameInfoStruct = new gameInfoStruct();

            // 显示目录地址到label2
            gameDirPath = gamePath;
            label1.Text = "\n当前目录： " + gameDirPath;

            //定义函数line用来存放每一行文本
            string line;
            //定义一个开关a，一旦第一次读取到launch行，则a变成1
            var a = 0;
            //var tFile = "";

            //循环遍历txt文件
            while (!readerText.EndOfStream)
            {
                //把当前行存入line，每循环一次，ReadLine()就会自己跳到下一行
                line = readerText.ReadLine();
                //把当前行按“:”进行分割，存入数组tt
                char[] separator = { ':' };
                //separator必须是字符数组时，2才表示最大只分割出2个子数组
                string[] tt = line.Split(separator, 2);
                //如果a为0，说明读取的是文件头
                if (a == 0)
                {
                    //tt[0]是“:”之前的字段，把tt[1]存入相应的字段
                    if (tt[0] == "launch") 
                    {
                        // 第一次读取到launch行，说明游戏信息已经读完，a赋值为1
                        a = 1;

                    }
                    
                }
                //如果a不为0，说明读取到了游戏信息行。
                else
                {
                    switch (tt[0])
                    {
                        case "game":
                            //新的开始，初始化
                            gameInfoStruct = new gameInfoStruct();
                            //tFile = "";
                            // 暂定mediaType = 0
                            gameInfoStruct.mediaType = 0;
                            gameInfoStruct.game = tt[1];
                            break;
                        case "file":
                            gameInfoStruct.file = tt[1];
                            break;
                        case "files":
                            // 如果读取到files标签，说明file为双行，fileType = 1
                            gameInfoStruct.fileType = 1;
                            break;
                        case "assets.box_front":
                            gameInfoStruct.box = tt[1];
                            break;
                        case "description":
                            // 读取到"description"说明这个游戏的字段已经结束，判断这个游戏有没有封面
                            // 如果fileType == 1，则rom是多行，游戏封面应该按game命名
                            if (gameInfoStruct.fileType == 1)
                            {
                                // media文件夹中是否有封面
                                string fjpg = gameDirPath + "\\media\\" + gameInfoStruct.game.Trim() + "\\" + "boxFront.jpg";
                                string fpng = gameDirPath + "\\media\\" + gameInfoStruct.game.Trim() + "\\" + "boxFront.png";
                                if (File.Exists(fjpg)) gameInfoStruct.mediaDir = fjpg;
                                else if (File.Exists(fpng)) gameInfoStruct.mediaDir = fpng;

                            }
                            else
                            {
                                // media文件夹中是否有封面
                                string fgame = gameDirPath + "\\media\\" + gameInfoStruct.game.Trim() + "\\" + "boxFront";
                                string ffile = gameDirPath + "\\media\\" + Path.GetFileNameWithoutExtension(gameInfoStruct.file).Trim() + "\\" + "boxFront";
                                if (File.Exists(ffile + ".jpg")) gameInfoStruct.mediaDir = ffile + ".jpg";
                                else if (File.Exists(ffile + ".png")) gameInfoStruct.mediaDir = ffile + ".png";
                                     else if (File.Exists(fgame + ".jpg")) gameInfoStruct.mediaDir = fgame + ".jpg";
                                          else if (File.Exists(fgame + ".png")) gameInfoStruct.mediaDir = fgame + ".png";

                            }

                            // 判断box有没有媒体
                            if (gameInfoStruct.box != null) 
                            {
                                string fbox = gameDirPath + "\\" + gameInfoStruct.box.Trim();
                                if (File.Exists(fbox)) gameInfoStruct.mediaDir = fbox;
                            }
                            
                            // 把整个gameInfoStruct添加到gameList
                            gameList.Add(gameInfoStruct);
                            break;
                    }

                }
            }
            // 关闭readrText
            readerText.Close();

            // 弹窗提示读取情况
            string al = "";
            int alc = 0;
            for (int i = 0; i < gameList.Count(); i++)
            {
                if (gameList[i].mediaDir == null) 
                {
                    al += gameList[i].game + "\n";
                    alc++;
                }
            }
            MessageBox.Show("成功读取" + gameList.Count() + "个游戏，其中有" + alc +"个游戏没有封面：\n" + al, "铛铛！");

        }

        private void linkLabel3_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            // 打开目录
            if (Directory.Exists(gameDirPath))
            {
                System.Diagnostics.Process.Start("explorer.exe", gameDirPath);
            }
            else MessageBox.Show("你还没加载游戏目录呢！", "咳咳！");
            
        }

        private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            // 生成封面
            //修改前警告
            var ww = MessageBox.Show("铛铛！\n如果目标文件夹已经存在同名文件，则会覆盖！\n确定要继续吗？", "警告[○･｀Д´･ ○]", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
            if (ww != DialogResult.OK)
            {
                return;
            }
            nc = 0;
            string xc = "";
            int xxc = 0;
            if (Directory.Exists(gameDirPath))
            {
                for(int i = 0;i <= gameList.Count - 1; i++) 
                {
                    if (gameList[i].mediaDir != null ) 
                    {
                        string tn;
                        // 用Path.GetExtension()获取媒体文件的后缀名
                        // 用Path.GetFileNameWithoutExtension()获取不带后缀的文件名
                        if (gameList[i].fileType == 1) tn = gameList[i].game.Trim() + Path.GetExtension(gameList[i].mediaDir.Replace("/", "\\"));
                        else tn = Path.GetFileNameWithoutExtension(gameList[i].file.Trim().Replace("/", "\\")) + Path.GetExtension(gameList[i].mediaDir.Replace("/", "\\"));

                        // 判断目标文件夹存不存在，不存在就创建
                        if (!Directory.Exists(gameDirPath + "\\" + imgDirName + "\\"))
                        {
                            Directory.CreateDirectory(gameDirPath + "\\" + imgDirName + "\\");
                        }
                        // 复制图片
                        if (CopyFile(gameList[i].mediaDir, tn) == 1) nc++;
                        else { xc += gameList[i].game + "\n"; xxc++; }
                    }
                }
                MessageBox.Show("总任务数" + gameList.Count + "个，\n已完成" + nc + "个，\n失败" + xxc + "个，它们是：\n" + xc, "咳咳！");

            }
            else MessageBox.Show("你还没加载游戏目录呢！", "咳咳！");

        }

        private void linkLabel4_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            // 使用说明按钮
            string t1, t2, t3, t4, t5, t6;
            t1 = "1.先按△加载含有metadata.pegasus.txt的目录，再按○生成封面文件夹。\n  默认生成.images的文件夹，可以根据需求手动改名。\n";
            t2 = "2.本软件免费使用，但不可以用于不法用途哦。\n";
            t3 = "3.作者能力有限，软件有百把个bug实属平常，使用前要做好备份哦。\n";
            t4 = "4.作者对任何原因在使用此软件时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。\n";
            t5 = "5.感谢AI-Claude对本软件提供的过于强大的技术支持。\n";
            t6 = "6.如有问题或建议，欢迎到作者的B站或公众号留言，一起改进。\n\nB站账号（欢迎关注）：安图喵的小日常";
            MessageBox.Show(t1 + t2 + t3 + t4 + t5 + t6, "咳咳！");
        }

        private void linkLabel5_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            // 作者B站
            Process.Start("https://space.bilibili.com/186995/");
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            // 测试用
            //MessageBox.Show(Path.GetFileNameWithoutExtension("C:\\wocao"), "咳咳！");
        }


    }
}
